package org.com.wlc.jdkproxy;

import com.sun.org.apache.xpath.internal.operations.String;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 王立朝
 * @description jdk代理类
 *                  每一个代理类都需要实现InvocationHandler接口
 * @date 2021-11-28 09:09:47
 */
public class JdkHandler implements InvocationHandler {

    /**
     * 定义目标对象
     */
    private Object targetObject;

    public JdkHandler(Object targetObject) {
        this.targetObject = targetObject;
    }

    /**
     *
     * @param proxy 代理对象
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法执行之前=========");
        Object invoke = method.invoke(targetObject, args);
        System.out.println("==========方法执行之后");
        return invoke;
    }
    /**
     * 获取代理对象
     *
     * @return
     */
    public Object getProxy() {

        /*

    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        loader – 定义代理类的类加载器
            this.getClass().getClassLoader(): 类加载器
        接口 - 代理类要实现的接口列表
            this.targetObject.getClass().getInterfaces()：
        h – 将方法调用分派到的调用处理程序
            InvocationHandler 接口（传入InvocationHandler接口的实现类）

        返回：
        具有代理类的指定调用处理程序的代理实例，该代理类由指定的类加载器定义并实现指定的接口


         */

        Object object = Proxy.newProxyInstance(this.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);
        return object;
    }


}
